#ifndef XARP_H
#define XARP_H

#include "xnet_err.h"
#include "xnet_tiny.h"




#define XARP_CFG_ENTRY_OK_TMO (60)     // ARP的超时时间
#define XARP_CFG_ENTRY_PENDING_TMO (1) // 再次请求mac的等待时间
#define XARP_CFG_MAX_RETRIES 4         // 重试次数
#define XARP_TIMER_PERIOD 1            // 每一次xarp_poll执行的时间间隔


typedef enum _xarp_entry_state
{
    XARP_ENTRY_FREE = 0,   // 空闲
    XARP_ENTRY_OK = 1,     // 已经连接
    XARP_ENTRY_PENDING = 2 // 连接后超时，需要重新配置
} xarp_entry_status;

// arp保存数据的控制块
typedef struct _xarp_entry_t
{
    xipaddr_t ipaddr;
    uint8_t macaddr[XNET_MAC_ADDR_SIZE];
    xarp_entry_status state;
    uint16_t tmo;      // 超时时间
    uint8_t retry_cnt; // 重试次数
} xarp_entry_t;

#define XARP_HW_ETHER 0x1 //硬件类型 1表示以太网
#define XARP_REQUEST  0x1 //操作码，请求
#define XARP_REPLY    0x2 //操作码，响应

//arp包头
#pragma(1)
typedef struct _xarp_hdr_t{
    uint16_t hw_type,pro_type; //hardware type  protocol type
    uint8_t hw_len,pro_len;//hardware size protocol size , 电脑的默认hw_len是mac长度，pro_len是id的长度
    uint16_t opcode;//操作码，请求还是响应
    uint8_t send_mac[XNET_MAC_ADDR_SIZE];
    uint8_t sender_ip[XNET_IPV4_ADDR_SIZE];
    uint8_t target_mac[XNET_MAC_ADDR_SIZE];
    uint8_t target_ip[XNET_IPV4_ADDR_SIZE];
} xarp_hdr_t;
#pragma

static xnet_time_t arp_timer;// 定时器
static xarp_entry_t arp_entry; // 只保存一个arp映射

void update_arp_entry(uint8_t *src_ip, uint8_t *mac_addr);

void xarp_init();
void xarp_in(xnet_packet_t *packet);
void xarp_poll();
xnet_err_t xarp_make_request(const xipaddr_t* ipaddr);
xnet_err_t xarp_make_reponse(const uint8_t * target_ip,const uint8_t *target_mac);

xnet_err_t xarp_resolve(const xipaddr_t *ipaddr,uint8_t **mac_addr);
#endif // XARP_H